var lockReconnect = false; //避免ws重复连接
var ws = null; // 判断当前浏览器是否支持WebSocket
var socketOpen = false; //判断socket有没有打开
var wsUrl = "wss://socket.hjdz.ltd:2348"; //测试服
// var wsUrl = "wss://wss.dgddaijia.com:3468"; //正式服
var socketMsgQueue = [] // socket发送的消息队列
// createWebSocket(wsUrl); //连接ws

var socket = {
	socketTask: null,
	linkid: "",
	isCreate: true,
	createWebSocket: function() {
		//创建socket连接
		// try {
		// 	if ('WebSocket' in window) {
		socketMsgQueue = []
		socket.socketTask = ws = wx.connectSocket({
			//socket管理
			url: wsUrl,
			success: (res) => {
				socketOpen = true;
				// console.log('res',res)
			},
			fail: (err) => {
				socket.reconnect(wsUrl);
				// socket.createWebSocket();
			}
		})
		// 	}
		socket.initEventHandle();
		// } catch (e) {
		// 	reconnect(url);
		// 	console.log(e);
		// }
	},
	close(isCreate) {
		if (isCreate === undefined) isCreate = true;
		socket.isCreate = isCreate;
		socket.socketTask.close();
	},
	initEventHandle: function() {
		// 监听socket的状态
		socket.socketTask.onClose(function(res) {
			socketOpen = false;
			// console.log('连接关闭', res)
			// console.log(socket.isCreate)
			if (socket.isCreate) {
				socket.createWebSocket() //执行重连
			}
			// console.log("llws连接关闭!" + new Date().toLocaleString());
		})
		socket.socketTask.onError(function(res) {
			// console.log('出现错误', res)
		})
		socket.socketTask.onOpen(function(res) {
			socketOpen = true;
			// console.log('连接打开', res)
			socket.heartCheck.reset().start(); //心跳检测重置
			console.log("llws连接成功!" + res + new Date().toLocaleString())
		})
		socket.socketTask.onMessage(function(res) { //如果获取到消息，心跳检测重置
			socket.heartCheck.reset().start(); //拿到任何消息都说明当前连接是正常的
			// res.JSON.
			console.log(res);
			if (typeof socket.onSocketMessageCallback === 'function') {
				socket.onSocketMessageCallback(res.data);
			} else {
				// console.log('1',socket.onSocketMessageCallback(event.data))
				var intval = setInterval(function() {
					if (typeof socket.onSocketMessageCallback === 'function') {
						socket.onSocketMessageCallback(res.data)
						clearInterval(intval)
					}
				}, 100)
			}
		})
	},
	sendMessage(options) {
		return sendSocketMsg(options)
	},
	reconnect: function(url) {
		// 重连socket
		if (lockReconnect) return;
		lockReconnect = true;
		setTimeout(function() { //没连接上会一直重连，设置延迟避免请求过多
			socket.createWebSocket();
			lockReconnect = false;
		}, 1000);
	},
	heartCheck: {
		//心跳机制
		timeout: 10000, //10秒钟发一次心跳
		timeoutObj: null,
		serverTimeoutObj: null,
		reset: function() {
			clearTimeout(this.timeoutObj);
			clearTimeout(this.serverTimeoutObj);
			return this;
		},
		start: function() {
			var self = this;
			// console.log("开始心跳")
			// var 
			this.timeoutObj = setTimeout(function() {
				//这里发送一个心跳，后端收到后，返回一个心跳消息，
				//onmessage拿到返回的心跳就说明连接正常
				ws.send({
					data: JSON.stringify({
						event: 'ping', //心跳
						data: {},
						success: function() {}
					})
				});
				// console.log("ping!")
				self.serverTimeoutObj = setTimeout(function() { //如果超过一定时间还没重置，说明后端主动断开了
					ws.close();
					//如果onclose会执行reconnect，我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
				}, self.timeout + 2000)
			}, this.timeout)
		}
	},
}

function sendSocketMsg(options) {
	//发送socket信息
	options.data.data.linkid = socket.linkid
	// console.log('消息发送', options)
	//发送消息
	if (socketOpen) {
		ws.send({
			data: JSON.stringify(options.data),
			success: function(res) {
				if (options) {
					options.success && options.success(res);
				}
			},
			fail: function(res) {
				if (options) {
					options.fail && options.fail(res);
				}
			}
		})
	} else {
		socketMsgQueue.push(options.data)
	}
}

// 监听WebSocket接受到服务器的消息事件。
// function getMessage(res) {
// 	if (socketOpen) {
// 		ws.onMessage(function(res) {
// 			console.log('收到服务器内容：' + res.data)
// 			if (res.data == 'SUCCESS') {
// 				return;
// 			}
// 			if (res.event == 'order_status') {
// 				console.log('获取订单状态', res.data)
// 			}
// 			// console.log('执行事件', ws)
// 			console.log(typeof ws.onMessageCallback === 'function')
// 			if (typeof ws.onMessageCallback === 'function') {
// 				ws.onMessageCallback(res.data);
// 			} else {
// 				var intval = setInterval(function() {
// 					if (typeof ws.onMessageCallback === 'function') {
// 						ws.onMessageCallback(res.data)
// 						clearInterval(intval)
// 					}
// 				}, 100)
// 			}
// 		})
// 	}
// }



// 监听窗口关闭事件，当窗口关闭时，主动去关闭websocket连接，防止连接还没断开就关闭窗口，server端会抛异常。
// window.onbeforeunload = function() {
// 	ws.close();
// }


module.exports = {
	socket: socket,
	sendSocketMsg: sendSocketMsg,
	// getMessage: getMessage,
}
